package com.leyou.trade.service.impl;

import com.leyou.auth.dto.UserDetail;
import com.leyou.auth.utils.UserContext;
import com.leyou.trade.entity.CartItem;
import com.leyou.trade.repository.CartRepository;
import com.leyou.trade.service.CartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private CartRepository cartRepository;

    @Autowired
    private MongoTemplate mongoTemplate;

    private String createId(Long skuId) {

        return String.format("u%ds%d",UserContext.getUser().getId(),skuId);

    }

    @Override
    public void saveCartItem(CartItem cartItem) {

        // 1.获取用户信息
        Long userId = UserContext.getUser().getId();

        // 2.处理购物车商品
        cartItem = handleUpdateItem(userId,cartItem);

        // 写入db
        cartRepository.save(cartItem);

    }

    @Override
    public List<CartItem> queryCartList() {

        // 1.获取用户信息
        Long userId = UserContext.getUser().getId();

        // 2.查询购物车
        List<CartItem> cartItems = cartRepository.findByUserId(userId, Sort.by("updateTime").descending());

        return cartItems;
    }

    @Override
    public void updateCartItemNum(Long skuId, int num) {

        mongoTemplate.update(CartItem.class)
                // 根据id匹配
                .matching(Query.query(Criteria.where("_id").is(createId(skuId))))
                // 更新num字段
                .apply(Update.update("num",num).currentDate("updateTime"))
                .first();

    }

    @Override
    public void deleteCartItem(Long skuId) {

        this.cartRepository.deleteById(createId(skuId));

    }

    private CartItem handleUpdateItem(Long userId,CartItem cartItem) {

        // optional是在jdk1.8之后再引入的，可以看成是一个list集合，但是比list集合要强大，集合内部加入了非空一类的判断
        Optional<CartItem> optional = cartRepository.findById(createId(cartItem.getSkuId()));

        // 3.判断购物车中是否存在要与添加的商品id一致的商品
        if (optional.isPresent()) {

            // 存在 记录新的商品数量
            Integer num = cartItem.getNum();

            // 获取旧的数据
            cartItem = optional.get();

            // 数量累加
            cartItem.setNum(num = num + cartItem.getNum());

        }

        // 补充时间，userId、时间
        cartItem.setUserId(userId);

        cartItem.setUpdateTime(new Date());

        return cartItem;

    }

    @Override
    public void addLocalStorageToCartItemList(List<CartItem> cartItemList) {

        // 1.获取用户id
        Long userId = UserContext.getUser().getId();

        // 2.转换
        List<CartItem> list = cartItemList.stream().map(cartItem -> handleUpdateItem(userId, cartItem)).collect(Collectors.toList());

        // 3.新增或修改
        this.cartRepository.saveAll(list);

    }
}
